﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Model.Refeicoes;
using Repository.SQL.Refeicoes;
using Repository.SQL.DataViews;


namespace Services.Refeicoes
{
    public class RefeicaoService
    {
        
        #region Views

        public static DataSet ObterListaUnidadesComRefeicoesEstadoRec()
        {
            RefeicoesViews views = new RefeicoesViews();
            return views.ObterListaUnidadesComRefeicoesEmAberto();
        }

        #endregion


        #region Refeicão

        public static IList<Refeicao> ObterListaRefeicoes(String estado)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterRefeicaoPorEstado(estado);
        }

        public static IList<Refeicao> ObterRefeicaoPorContratoDataRefeicao(Int64 numeroContrato, DateTime dataRefeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterRefeicaoPorContratoDataRefeicao(numeroContrato, dataRefeicao);
        }

        public static Refeicao ObterRefeicao(Int64 idRefeicaoContratada, DateTime dataRefeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterPorRefeicaoContratadaData(idRefeicaoContratada, dataRefeicao);
        }

        public static IList<Refeicao> ObterRefeicoesContratadas(Int64 idUnidade, DateTime dataRefeicao)
        {                             
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodasContratadasPorUnidadeData(idUnidade, dataRefeicao);
        }

        public static void ActualizaEstadoContadoresEfectivosRefeicao(Int64 numeroContrato, DateTime dataRefeicao)
        {
            IList<Refeicao> refeicoes = ObterRefeicaoPorContratoDataRefeicao(numeroContrato, dataRefeicao);

            foreach (Refeicao refeicao in refeicoes)
            {
                IList<RefeicaoUnidade> refeicoesUnidades 
                    = ObterRefeicaoUnidadeContratadas(refeicao.RefeicaoContratada.IdRefeicaoContratada, dataRefeicao);

                Decimal totalVendasEfectivo = 0;
                Decimal totalCustosEfectivo = 0;
                Boolean vendasPreenchidas = true;
                foreach (RefeicaoUnidade refeicaoUnidade in refeicoesUnidades)
                {
                    if(refeicaoUnidade.RefeicoesServidas.HasValue)
                        totalVendasEfectivo += refeicaoUnidade.RefeicoesServidas.Value * refeicaoUnidade.PrecoRefeicao;
                    else if (refeicaoUnidade.RefeicoesPrevistas.HasValue)
                    {
                        vendasPreenchidas = false;
                    }
                    if (refeicaoUnidade.Refeicao.TotalCustosPrevisto.HasValue)
                        totalCustosEfectivo += refeicaoUnidade.Refeicao.TotalCustosPrevisto.Value;
                }
                
                if (totalVendasEfectivo == 0)
                    refeicao.RacioMateriasPrimasEfectivo = 0;
                else
                    refeicao.RacioMateriasPrimasEfectivo = totalCustosEfectivo / totalVendasEfectivo;

                if ((refeicao.CodEstadoRefeicao == EstadoRefeicao.RequisicaoEmitida) && vendasPreenchidas)
                    refeicao.CodEstadoRefeicao = EstadoRefeicao.Fechada;


                RefeicaoService.Actualiza(refeicao);

            }
            
        }

        #endregion


        #region Refeição Unidade

        public static IList<RefeicaoUnidade> ObterRefeicaoUnidadeContratadas(Refeicao refeicao)
        {                             
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodosRefeicaoUnidadeContratadasPorRefeicao(refeicao);
        }

        public static IList<RefeicaoUnidade> ObterRefeicaoUnidadeContratadas(Int64 idRefeicaoContratada, DateTime dataRefeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodosRefeicaoUnidadeContratadasPorRefeicao(idRefeicaoContratada, dataRefeicao);
        }
        
        public static IList<RefeicaoUnidade> ObterTodosRefeicaoUnidadeAguradaNumRefeicoesServidas()
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodosRefeicaoUnidadeAguradaNumRefeicoesServidas();
        }

        public static IList<RefeicaoUnidade> ObterListaRefeicaoUnidades(Int64 idRefeicaoContratada, DateTime dataRefeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodosRefeicaoUnidadePorRefeicao(idRefeicaoContratada, dataRefeicao);
        }

        public static IList<RefeicaoUnidade> ObterListaRefeicaoUnidadesPorUnidadeDataRefeicao(Int64 idUnidade, DateTime dataRefeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodosRefeicaoUnidadePorUnidadeDataRefeicao(idUnidade, dataRefeicao);
        }
        
        #endregion

        public static IList<RefeicaoOpcao> ObterListaRefeicaoOpcao(Int64 idRefeicaoContratada, DateTime dataRefeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.ObterTodosRefeicaoOpcaoPorRefeicao(idRefeicaoContratada, dataRefeicao);
        }


        #region command

        public static IList<Refeicao> Insere(IList<Refeicao> refeicoes)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.Insere(refeicoes);
        }

        public static Refeicao Actualiza(Refeicao refeicao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.Actualiza(refeicao);
        }

        public static RefeicaoUnidade Actualiza(RefeicaoUnidade refeicaoUnidade)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.Actualiza(refeicaoUnidade);
        }

        public static IList<RefeicaoUnidade> Actualiza(IList<RefeicaoUnidade> listRefeicaoUnidade)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.Actualiza(listRefeicaoUnidade);
        }

        public static RefeicaoOpcao Actualiza(RefeicaoOpcao refeicaoOpcao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.Actualiza(refeicaoOpcao);
        }

        public static IList<RefeicaoOpcao> Actualiza(IList<RefeicaoOpcao> listRefeicaoOpcao)
        {
            IRefeicaoRepository refeicaoRepository = new RefeicaoRepository();
            return refeicaoRepository.Actualiza(listRefeicaoOpcao);
        }

        #endregion
    }
}
